// TODO函数的任务就是抛出异常，就是永远别指望它运行成功，返回Nothing类型。
// public inline fun TOD0(reason: String): Nothing = throw NotImplementedError

// fun  函数名--参数--参数类型--返回值

private fun basic() {
    fun add(x: Int): Int {
        var a: Int = -1
        return a + x
    }

    /*Kotlin可以使用空格和特殊字符对函数命名，不过函数名要用一对反引号括起染为了支持Kotlin和Java互操作，
    而Kotlin和Java各自却有着不同的保留关键字，不能作为函数名，使用反引号括住函数名就能避免任何冲突。*/
    fun `hello world`() {
        println("hello world")
    }

    fun `你好`() {
        println("hello world")
    }

    `hello world`()
    `你好`()
    var no = fun(a: Int) {
        println("no name")
    }
    //匿名函数 摸得默认参数
    var aaa: (Int) -> Unit = fun(a: Int) = println("aaa")


}

/*//具名函数
fun res(name: String, age: Int = 2) {//定义时赋值
    res(name = "al", age)//命名值传参
}*/

//闭包
//在Kotlin中，匿名函数能修改并引用定义在自己的  作用域  之外的 变量，
//匿名函数引用  定义自身的函数里的  变量 ，Kotlin中的lambda就是闭包。
//能接收函数或者返回函数的函数 又叫做高级函数，高级函数广泛应用于函数式编程当中*/

// 闭包
private fun cccc(a: Int, b: String = ""): (Int) -> Int {
    return fun(d: Int): Int {
        return a + d
    }
}

private fun dddd(a: Int, c: (Int) -> Int): Int {
    return c(a)
}

private  fun main() {
    cccc(1)(12)
    dddd(a = 12, c = { it })
    dddd(a = 12) { it }
}